package Modelo.Patrocinio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import Util.ExcecaoInstanciaNaoEncontrada;

public class PatrocinioDao {
	
	private String cnpjPatrocinador;
	private long codEvento;
	private long nroEdicao;
	private float valorPatrocinio;
	private float saldoPatrocinio;
	
	public PatrocinioDao() {
		super();
	}
	public Patrocinio adicionarPatrocinio(Connection connection,Patrocinio patrocinio){
		/* Criar "queryString". 
		 * Interrogacoes serao os parametros passados ao objeto
		 * preparedStatement*/
		String queryString = "INSERT INTO Patrocinio"
				+ " ( cnpjPatrocinador, codEvento,"
				+ "nroEdicao, valorPatrocinio,saldoPatrocinio)"
				+ " VALUES (?, ?, ?, ?, ?)";
		//Objeto que ira enviar a querrystring ao banco de dados 
		try (PreparedStatement preparedStatement = connection.prepareStatement(
				queryString)) {

			int i = 1;
			int insertedRows = 0;
			//Coloca os parametros na mesma ordem indicada na querrystring
			preparedStatement.setString(i++, patrocinio.getCnpjPatrocinador());
			preparedStatement.setLong(i++, patrocinio.getCodEvento());
			preparedStatement.setLong(i++, patrocinio.getNroEdicao());
			preparedStatement.setFloat(i++, patrocinio.getValorPatrocinio());
			preparedStatement.setFloat(i++, patrocinio.getSaldoPatrocinio());
			insertedRows = preparedStatement.executeUpdate(); //Executa o comando SQL

			if (insertedRows == 0) {
				throw new SQLException("Can not add row to table 'PatrocinioIntern'");
			}

			if (insertedRows > 1) {
				throw new SQLException("Duplicate row in table 'PatrocinioIntern'");
			}

			return new Patrocinio(patrocinio.getCnpjPatrocinador(), patrocinio.getCodEvento(), 
					patrocinio.getNroEdicao(), patrocinio.getValorPatrocinio(), 
					patrocinio.getSaldoPatrocinio());
			
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public Patrocinio buscarPatrocinio(Connection connection, String cnpjPatrocinador, 
			Long codEvento,Long nroEdicao)
			throws ExcecaoInstanciaNaoEncontrada{
		
		
		String queryString = "SELECT valorPatrocinio, saldoPatrocinio" +
				" FROM Patrocinio WHERE cnpjPatrocinador = ? AND codEvento = ? AND nroEdicao = ?";
		
		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {

			int i = 1;
			preparedStatement.setString(i++, cnpjPatrocinador);
			preparedStatement.setLong(i++, codEvento);
			preparedStatement.setLong(i++, nroEdicao);
			//Pega os Resultados da busca
			ResultSet resultSet = preparedStatement.executeQuery();

			if(!resultSet.next()){
				throw new ExcecaoInstanciaNaoEncontrada(cnpjPatrocinador,
						new Long[] {codEvento, nroEdicao}, "Patrocinio");

			}
			
			i = 1;
			float valorPatrocinio = resultSet.getFloat(i++);
			float saldoPatrocinio = resultSet.getFloat(i++);
			return new Patrocinio(cnpjPatrocinador, codEvento, nroEdicao, 
					valorPatrocinio, saldoPatrocinio);


		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	public void removerPatrocinio(Connection connection, String cnpjPatrocinador, 
			Long codEvento, Long nroEdicao)
			throws ExcecaoInstanciaNaoEncontrada{
		String queryString = "DELETE FROM Patrocinio "
				+ "WHERE cnpjPatrocinador = ? "
				+ "AND codEvento = ? "
				+ "and nroEdicao = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {
			int i = 1;
			preparedStatement.setString(i++, cnpjPatrocinador);
			preparedStatement.setLong(i++, codEvento);
			preparedStatement.setLong(i++, nroEdicao);

			int removedRows = preparedStatement.executeUpdate();

			if(removedRows == 0){
				throw new ExcecaoInstanciaNaoEncontrada(cnpjPatrocinador,
						new Long[] {codEvento, nroEdicao}, "Patrocinio");
			}

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}
	public void updatePatrocinio(Connection connection, Patrocinio patrocinio) 
			throws ExcecaoInstanciaNaoEncontrada {

		int updateRows = 0;

		String queryString = "UPDATE Patrocinio "
				+ "SET valorPatrocinio = ?, saldoPatrocinio = ?"
				+ "WHERE cnpjPatrocinador = ? "
				+ "AND codEvento = ? "
				+ "AND nroEdicao = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)){
			int i = 1;
			preparedStatement.setFloat(i++, patrocinio.getValorPatrocinio());
			preparedStatement.setFloat(i++, patrocinio.getSaldoPatrocinio());
			preparedStatement.setString(i++, patrocinio.getCnpjPatrocinador());
			preparedStatement.setLong(i++, patrocinio.getCodEvento());
			preparedStatement.setLong(i++, patrocinio.getNroEdicao());
			updateRows = preparedStatement.executeUpdate();

			if(updateRows == 0){
				throw new ExcecaoInstanciaNaoEncontrada(patrocinio.getCnpjPatrocinador(),
						new Long[] {patrocinio.getCodEvento(), patrocinio.getNroEdicao()}, "Patrocinio");
			}

			else if(updateRows > 1){
				throw new SQLException("Linha duplicada para o identificador = '" + "' "
						+ "na tabela 'Patrocinio'");
			}


		} catch (SQLException e) {
			throw new RuntimeException(e);
		}


	}
	
	public List<Patrocinio> buscarPatrocinioPorCNPJ(Connection connection, String CNPJ) {
		
		String queryString = "SELECT * FROM Patrocinio" + " WHERE cnpjPatrocinador = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {
			int i = 1;
			
			preparedStatement.setString(i++, CNPJ);
			
			ResultSet resultSet = preparedStatement.executeQuery();
			List<Patrocinio> patrocinios = new ArrayList<Patrocinio>();

			while(resultSet.next()){
				i = 1;
				
				this.cnpjPatrocinador = resultSet.getString(i++);
				this.codEvento = resultSet.getLong(i++);
				this.nroEdicao = resultSet.getLong(i++);
				this.valorPatrocinio = resultSet.getFloat(i++);
				this.saldoPatrocinio = resultSet.getFloat(i++);
				
				patrocinios.add(new Patrocinio(this.cnpjPatrocinador, this.codEvento, nroEdicao, valorPatrocinio, saldoPatrocinio));
				
				
			}
			return patrocinios;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public List<Patrocinio> buscarCNPJPatrocinioPorEDICAOeEVENTO(Connection connection, long codEvento, long nroEdicao) {
		
		String queryString = "SELECT p.cnpjPatrocinador FROM Patrocinio p"
							+ " WHERE p.codEvento = ? AND p.nroEdicao = ?";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {
			int i = 1;
			
			preparedStatement.setLong(i++, codEvento);
			preparedStatement.setLong(i++, nroEdicao);
			
			ResultSet resultSet = preparedStatement.executeQuery();
			List<Patrocinio> patrocinios = new ArrayList<Patrocinio>();

			while(resultSet.next()){
				i = 1;
				
				this.cnpjPatrocinador = resultSet.getString(i++);
				
				patrocinios.add(new Patrocinio(this.cnpjPatrocinador));
			}
			return patrocinios;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public List<Patrocinio> buscarTodosPatrocinios(Connection connection) {
		
		String queryString = "SELECT * FROM Patrocinio";

		try (java.sql.PreparedStatement preparedStatement = connection.prepareStatement(queryString)) {
			
			ResultSet resultSet = preparedStatement.executeQuery();
			List<Patrocinio> patrocinios = new ArrayList<Patrocinio>();

			while(resultSet.next()){
				int i = 1;
				
				this.cnpjPatrocinador = resultSet.getString(i++);
				this.codEvento = resultSet.getLong(i++);
				this.nroEdicao = resultSet.getLong(i++);
				this.valorPatrocinio = resultSet.getFloat(i++);
				this.saldoPatrocinio = resultSet.getFloat(i++);
				
				patrocinios.add(new Patrocinio(this.cnpjPatrocinador, this.codEvento, nroEdicao, valorPatrocinio, saldoPatrocinio));
			}
			return patrocinios;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
}